package 集合.二叉树;

import Useless.Test.Student;

import java.util.Comparator;
import java.util.TreeSet;

public class treeSet {
//    treeSet：不重复、无索引、可排序
//    底层基于红黑树实现排序，增删改查性能较好
//    自定义排序的规则：
//    1.javabean类实现Comparable接口，指定比较规则(默认方式)
//    在使用第二种方式的前提是：方式一无法满足要求（例如Integer类型，或者按照从小到大的方式排列。。）
//    两种方式同时存在，以第二种方式为准
//    2.创建集合时，自定义Comparator比较器对象，指定比较规则
    /*
    * TreeSet集合默认排序规则
    * 1.对于数值类型：Integer，double，默认按照从小到大的顺序进行排序
    * 2.对于字符，字符串类型，按照字符在Ascll码表中的数字升序进行排序
    * 3.对于字符串多个字母，按照首字母排列，首字母一样，按照第二个字母排列
    * 例如 "aaa" "ab" "aba" "cd" "qwer"
    * 例如 "aaa"  "aaaa" "aaab"
    * */
public static void main(String[] args) {
/*
//    创建对象
    TreeSet<Integer>ts=new TreeSet();
//    添加元素
    ts.add(5);
    ts.add(1);
    ts.add(2);
    ts.add(4);
    ts.add(3);
    TreeSet<String>ts1=new TreeSet();
    ts1.add("aaaa");
    ts1.add("aaa");
    System.out.println(ts1);

//    遍历(三种便利方式)
    System.out.println(ts);//[1, 2, 3, 4, 5]
    */



    /*
    需求：创建treeSet集合，并添加学生对象
    学生对象属性：姓名，年龄，
    要求按照学生的年龄进行排序
    同年龄按照姓名的字母排列
    同姓名，同年龄认为同一个人
     */
//      创建集合对象
    TreeSet<student> ts=new TreeSet<>();
//    创建学生对象
    student s1=new student("zhangsan",18);
    student s2=new student("lisi",17);
    student s3=new student("wangwu",19);
    student s4=new student("zhangsan",17);
//      添加元素
    ts.add(s1);
    ts.add(s2);
    ts.add(s3);
    System.out.println(ts.add(s4));
//    排序
    //方法一：在student类中实现comparable接口
   // public calss student implements Comparable<student>表示比较的就是student
//    方法二：比较器比较
//    o1表示当前要添加元素
//    o2表示已经存在的元素
    /*
    TreeSet<student> ts1=new TreeSet<>(new Comparator<student>() {
        @Override
        public int compare(student o1, student o2) {
//            要求按照学生的年龄进行排序
            int i = o1.getAge() - o2.getAge();
//            同年龄按照姓名的字母排列
            i=i==0?o1.getName().compareTo(o2.getName()):i;
            return i;
        }
    });
    */
    System.out.println(ts);
}
}
class student implements Comparable<student>{
    private String name;
    private int age;

    public student() {
    }

    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public int compareTo(student o) {
//        在这里指定排序的规则

//        按照年龄大小进行升序排列
        int i = this.getAge() - o.getAge();
//        按照名字首字母进行升序排列
        i=i==0?this.getName().compareTo(o.getName()):i;
//        按照身高(年级。。。)进行升序排列
//        i=i==0?this.getHeight()-o.getHeight();

        if (i>0){
            return 1;
        } else if (i<0) {
            return -1;
        }else
        {
            return 0;
        }
    }
}


